#include <iostream>
#include <string>
#include <vector>
#include <sw/redis++/redis.h>
#include <chrono>
#include <thread>
using std::cin;
using std::cout;
using std::endl;
using std::iostream;
using std::string;
using std::vector;

using namespace sw::redis;

template <class T>
void print(T &arr)
{

    for (auto it : arr)
    {
        cout << it << endl;
    }
}
template <class T>
void printoptional(const T &t)
{

    for (auto const &x : t)
    {

        if (x.has_value())
        {
            cout << x.value() << endl;
        }
    }
}

void test_lrpush_lrpop(Redis&redis){

    redis.flushall();
    redis.lpush("key1",{"1","2","3"});//这里第二个参数也重载了迭代器区间。
    redis.rpush("key1",{"4","5","6"});//这里第二个参数也重载了迭代器区间。
//321456
    vector<string> v;
    auto bt=std::back_inserter(v);
    redis.lrange("key1",0,5,bt);
    print(v);
    redis.rpop("key1");
    redis.lpop("key1");
    //2145
    v.clear();//这里back_inserter，尾插指向的是当前v的后一个位置，故需要及时清除。
    bt=std::back_inserter(v);
    redis.lrange("key1",0,5,bt);
    print(v);
}

void test_llen(Redis&redis){
    redis.flushall();
    redis.lpush("key1",{"1","2","3"});//这里第二个参数也重载了迭代器区间。
    redis.rpush("key1",{"4","5","6"});//这里第二个参数也重载了迭代器区间。

   cout<<"总长度："<< redis.llen("key1")<<endl;
      vector<string> v;
    auto bt=std::back_inserter(v);
    redis.lrange("key1",0,10,bt);
    print(v);
   
}


void test_blpop_brpop(Redis&redis){
     redis.flushall();
   cout<<"开始阻塞获取"<<endl;
   auto ret= redis.blpop({"key2","key1"});
   cout<<"list: "<<ret.value().first<<" val: "<<ret->second;
      cout<<"开始阻塞获取"<<endl;
    ret= redis.brpop({"key3"});
   cout<<"list: "<<ret.value().first<<" val: "<<ret->second;
}

int main()
{

    Redis redis("tcp://127.0.0.1:6379");
    redis.command("select", 6);

// test_lrpush_lrpop(redis);


//test_llen(redis);

 test_blpop_brpop(redis);
    return 0;
}
